/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package validacao;

import entidade.IAtributo;
import entidade.IEntidade;
import excecoes.ValidacaoSemanticaException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;

/**
 *
 * @author Emanoel
 * Realiza a validacao semântica. Talvez com métodos estáticos para facilitar o uso.
 */
public class ValidacaoSemantica {

    private static HashMap<String, ConfigValidacaoSemantica> config;

    public static void validacaoSemantica(IEntidade entidade) throws ValidacaoSemanticaException {
        carregarValidacaoSemanticaConfig();
        String nome = entidade.getNome().toLowerCase();
        if (config.containsKey(nome)) {
            ConfigValidacaoSemantica configVal = config.get(entidade.getNome());
            Collection<IAtributo> atributos = entidade.getAtributos().values();
            Iterator<IAtributo> it = atributos.iterator();
            IAtributo atributo = null;
            while (it.hasNext()) {
                atributo = it.next();
                if (!configVal.possuiAtributo(atributo.getNome())) {
                    throw new ValidacaoSemanticaException("Attribute " + atributo.getNome() + " is not known.");
                }
            }
        } else {
            throw new ValidacaoSemanticaException("Entity " + entidade.getNome() + " not found in definitions.");
        }
    }

    public static void carregarValidacaoSemanticaConfig() {
        try {
            config = new HashMap<String, ConfigValidacaoSemantica>();
            ArrayList<ConfigValidacaoSemantica> definicoes = GerenciadorSemantico.carregarDefinicoesDB();
            for (int i = 0; i < definicoes.size(); i++) {
                config.put(definicoes.get(i).getName(), definicoes.get(i));
            }
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(ValidacaoSemantica.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ValidacaoSemantica.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
